ゴッドフィールド自作スキンとブラウザ依存型クローラー 第1夜
まずはこれを見なさい
私によって魔改造されたゴッドフィールド
Githubリポはこっち
音や絵、文字までもが変えられていますね
今回はこれをどうやってやるかを解説します、ちなみにCtrl+sや適当なサイト抜きソフトじゃできません
まずなんでできないの?ってことですが、/tcom/seitan.iconを押さないと絵や音がロードされないようになっているんですね
↓サイトを読み込んで何もしてない状態
https://scrapbox.io/files/65e8a5d58234ce00241db251.png
↓/tcom/seitan.iconを押した後
https://scrapbox.io/files/65e8a63c9610190024b47c0d.png
で、ゴッドフィールドは嬉しいことに静的なサイトなので、こいつらを抜いてindex.html内のパスなどを再配置すればなんとかなりそうですね
それでどうやって抜くねんって話ですが、タイトルにもある通り、「ブラウザ依存型クローラー」を使います
実はブラウザ(少なくともchrome)くんには、harというフォーマットで、サイトを訪れてから、サイトがどんなところにアクセスしたかどうか知らせてくれる機能があります、今回はそれを利用してファイルをダウンロードします
ちなみにアクセスしたapiもファイルと同じように記録されているので、行儀が悪いですがこのまま続行します
まずは、/tcom/seitan.iconを押したタブを用意します
ほんでデバッグコンドールのネットワークタブを開いて
https://scrapbox.io/files/65e8a818bc6032002589b279.png
となっていたらあなたはネットワークのログを1度取ったことがありますね、こんなうじゃうじゃしてないよって人は左上に鎮座しているいかにも記録してくれそうなボタンを押して、ページをリロード!そしてまた/tcom/seitan.iconを押しましょうね
くっそどうでもいいんだけどさっきから「している」が「シている」に変換されるんだが勘弁して
その後、左上に鎮座しているいかにもダウンロードしてくれそうなボタンを押し、harファイルを「エクスポート」しましょう
/tcom/omounayo.icon「この形の全部が全部ダウンロードしてくれるボタンだと思うなよ」
ゴッドフィールドの改造版を作ろうとしていた時の私は
/tcom/takunnma.icon「外部ソフト当てにならんわ笑笑、自分で抜くやつ作るか〜」
となり、ChatGPT3.5でスクリプトを書きました、動きました、うれしかったです
まあ別にharファイルを元にしてファイルを全部落としてくれるソフトだったら何でもいいです、できなくても知りませんが
でも私はそんなソフト見たこと無いですけどね調べてないだけ
スクリプト自体は先述したGithubリポ内にmain3.pyって名前であるなんであるんだよのですが、そこ見に行けって言うのは乱暴すぎるのでここに乗せときます
code:script.py
import json
import requests
import concurrent.futures
import os
def download_file(url, save_path):
try:
response = requests.get(url)
if response.status_code == 200:
with open(save_path, "wb") as file:
file.write(response.content)
print(f"Saved: {save_path}")
else:
print(f"Failed to download: {url}")
except Exception as e:
print(f"Error downloading file: {str(e)}")
def main(har_file_path):
with open(har_file_path, "r", encoding="utf-8") as har_file:
har_data = json.load(har_file)
entries = har_data.get("log", {}).get("entries", [])
download_tasks = []
for entry in entries:
request_url = entry.get("request", {}).get("url")
if request_url:
save_path = os.path.dirname(__file__) + "/" + "/".join(request_url.split("/")3:len(request_url.split("/"))) # ファイル名を取得
dir = "/".join(save_path.split("/")0:-1) + "/" # 作りたいディレクトリ名
os.makedirs(dir, exist_ok=True)
download_tasks.append((request_url, save_path))
with concurrent.futures.ThreadPoolExecutor() as executor:
# ファイルのダウンロードを並列実行
futures = executor.submit(download_file, url, save_path) for url, save_path in download_tasks
# 完了したタスクをチェックし、エラーを処理
for future in concurrent.futures.as_completed(futures):
if future.exception() is not None:
print(f"Error in downloading: {future.exception()}")
if __name__ == "__main__":
har_file_path = "./hogehoge.har" # Harファイルのパスを指定
main(har_file_path)
ケツにある har_file_path 変数をコメントに書いてあるとおりにHarファイルのパスにしてくださいね
注意ですが、これを実行してもindex.htmlはもらえないので、それはchromeでCtrl+sで保存するやつを使ってください
疲れたので続きは次の夜にやりますね
次の夜では、
index.htmlとかのパスの相対化
どこを改変すればどこが変わるか
番外編:GithubPageへの公開方法
を予定しています、それでは〜〜
↓これはこの記事を書き終わった時刻だが、キリがよくてとても嬉しい
https://scrapbox.io/files/65e8ae41dbd1590025496f71.png
次の夜:ゴッドフィールド自作スキンとブラウザ依存型クローラー 第2夜
#ゆめにっき